home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Skunkware 5
/
Skunkware 5.iso
/
src
/
Tools
/
shar-3.49
/
uushar.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-05-03
|
1KB
|
74 lines
/* $Header: /u/rhg/src/shar/uushar.c,v 3.49 90/09/12 15:15:26 rhg Exp $ */
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
/* ENC is the basic 1 character encoding function to make a char printing */
#if 1 /* Richard H. Gumpertz (RHG@CPS.COM), 24 April 1990 */
#define ENC(c) ((((c) + 077) & 077) + 041)
#else /* RHG */
#define ENC(c) ((((c) & 077) + ' ') | ((c & 077) == 0 ? 0100 : 0))
#endif /* RHG */
encode (in, out)
FILE *in;
FILE *out;
{
char buf[80];
int i, n;
for (;;)
{
/* 1 (up to) 45 character line */
n = fr (in, buf, 45);
putc (ENC (n), out);
for (i = 0; i < n; i += 3)
outdec (&buf[i], out);
putc ('\n', out);
if (n <= 0)
break;
}
}
/*
* output one group of 3 bytes, pointed at by p, on file f.
*/
outdec (p, f)
char *p;
FILE *f;
{
int c1, c2, c3, c4;
c1 = *p >> 2;
c2 = (*p << 4) & 060 | (p[1] >> 4) & 017;
c3 = (p[1] << 2) & 074 | (p[2] >> 6) & 03;
c4 = p[2] & 077;
putc (ENC (c1), f);
putc (ENC (c2), f);
putc (ENC (c3), f);
putc (ENC (c4), f);
}
/* fr: like read but stdio */
int
fr (fp, buf, cnt)
FILE *fp;
char *buf;
int cnt;
{
int c, i;
for (i = 0; i < cnt; i++)
{
c = getc (fp);
if (c == EOF)
return (i);
buf[i] = c;
}
return (cnt);
}
/* vi: set tabstop=4 shiftwidth=4: */